package com.gpnu7_412.yanzhi.service;

import com.github.pagehelper.PageInfo;
import com.gpnu7_412.yanzhi.dto.ConciseUserDto;
import com.gpnu7_412.yanzhi.entity.User;
import com.gpnu7_412.yanzhi.dto.UserMessageDto;
import com.gpnu7_412.yanzhi.entity.UserHanding;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author ZZH
 * @author HJJ
 */
public interface UserService {
    /**
     * 用户注册
     * @param user 用户信息
     * @return boolean
     */
    boolean register(User user);

    /**
     * 用户使用密码登录
     * @param email 用户邮箱
     * @param password 用户密码
     * @return 用户对象
     */
    User loginByPassword(String email, String password);

    /**
     * 用户使用验证码登录
     * @param email 用户邮箱
     * @return 用户对象
     */
    User loginByVerification(String email);

    /**
     * 用户忘记密码
     * @param email 用户邮箱
     * @param newPassword 用户新密码
     * @return boolean
     */
    boolean forgetPassword(String email, String newPassword);

    /**
     * 修改用户基本信息
     * @param userMessageDto 用户信息
     * @return boolean
     */
    boolean updateBaseMessage(UserMessageDto userMessageDto);

    /**
     * 修改当前登录用户头像
     * @param avatarFile 头像文件
     * @param userId 用户ID
     * @return boolean
     */
    boolean updateAvatar(MultipartFile avatarFile, Integer userId);

    /**
     * 用户修改密码
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return boolean
     */
    boolean updatePassword(Integer userId, String oldPassword, String newPassword);

    /**
     * 用户修改邮箱
     * @param userId 用户ID
     * @param newEmail 新邮箱
     * @return boolean
     */
    boolean updateEmail(Integer userId, String newEmail);

    /**
     * 用户关注
     * @param userId 用户ID
     * @param likeUserId 被关注用户ID
     * @return boolean
     */
    boolean attention(Integer userId, Integer likeUserId);

    /**
     * 用户取消关注
     * @param userId 用户ID
     * @param likeUserId 被取关用户ID
     * @return boolean
     */
    boolean unfollow(Integer userId, Integer likeUserId);

    /**
     * 用户举报
     * @param userHanding 用户举报对象
     * @return boolean
     */
    boolean report(UserHanding userHanding);

    /**
     * 用户注销
     * @param userId 用户ID
     * @return boolean
     */
    boolean deleteUser(Integer userId);

    /**
     * 生成Jwt令牌
     * @param user 用户信息
     * @return Jwt令牌
     */
    String getJwtToken(User user);

    /**
     * 获取用户所有信息
     * @param userId 用户ID
     * @return 用户信息对象
     */
    UserMessageDto getUserMessageById(Integer userId);

    /**
     * 分页查询所有用户
     * @param pageNum 查询页
     * @param pageSize 页面大小
     * @return 分页查询结果
     */
    PageInfo<ConciseUserDto> getAllUsersByPage(Integer pageNum, Integer pageSize);

    /**
     * 根据条件分页查询用户
     * @param pageNum 查询页
     * @param pageSize 页面大小
     * @param user 用户信息
     * @return 简洁用户对象列表
     */
    PageInfo<User> getUsersByCondition(Integer pageNum, Integer pageSize, User user);

    /**
     * 根据用户名模糊搜索
     * @param userName 用户名
     * @return 简洁用户对象列表
     */
    List<ConciseUserDto> getConciseUsersByName(String userName);

    /**
     * 根据用户邮箱前缀模糊查找用户
     * @param email 邮箱前缀
     * @return 简明用户对象列表
     */
    List<ConciseUserDto> getConciseUsersByEmail(String email);





    /**
     * 根据获取用户基本信息
     * @param userId 用户ID
     * @return 基本用户信息
     */
    User selectUserById(Integer userId);

    /**
     * 根据用户名搜索用户
     * @param userName 用户名
     * @return 用户列表
     * @deprecated
     */
    List<User> selectUserByUserName(String userName);

    /**
     *  根据邮箱搜索
     * @param email 邮箱
     * @return 用户列表
     * @deprecated
     */
    List<User> selectUserByEmail(String email);
}
